home *** CD-ROM | disk | FTP | other *** search
/ World of Video / World of Video.iso / gfxprograms / 3dprograms / t3dlib / source / t3dlib.h < prev    next >
C/C++ Source or Header  |  1995-02-13  |  9KB  |  324 lines

  1. /* ttdddlib.h - definitions needed to interface to TTDDD library
  2.  *            - written by Glenn M. Lewis - 7/19/91
  3.  * $Id: t3dlib.h,v 1.25 1993/01/30 23:43:03 glewis Exp $
  4.  */
  5.  
  6. #ifdef AMIGA
  7.  
  8. /* The following has been tested using SAS/C on an Amiga by Helge Rasmussen */
  9. #ifdef __SASC
  10. #include <string.h>
  11. #include <stdlib.h>
  12. #include <exec/types.h>
  13. #else
  14. #define  bcopy(s,d,n)    (void)memcpy((d),(s),(n))
  15. #define  bzero(d,n)        (void)memset((d),0,(n))
  16. #define  bcmp(b1,b2,n)    memcmp((b1),(b2),(n))
  17. #define  index            strchr
  18. #define  rindex            strrchr
  19. #endif
  20.  
  21. #else
  22.  
  23. #include <strings.h>
  24. #include <malloc.h>
  25. char *calloc();
  26.  
  27. #endif
  28.  
  29. #ifdef SYSV
  30. extern char *memcpy(), *memset();
  31. #define bcopy(s,d,n)    (void)memcpy((d),(s),(n))
  32. #define bzero(d,n)        (void)memset((d),0,(n))
  33. #define bcmp(b1,b2,n)    memcmp((b1),(b2),(n))
  34. #define index            strchr
  35. #define rindex            strrchr
  36. #endif
  37.  
  38. #ifndef AMIGA
  39. #ifndef UBYTE
  40. #define UBYTE unsigned char
  41. #endif
  42. #ifndef BYTE
  43. #define BYTE char
  44. #endif
  45.  
  46. #ifndef UWORD
  47. #define UWORD unsigned short
  48. #endif
  49. #ifndef WORD
  50. #define WORD short
  51. #endif
  52.  
  53. #ifndef ULONG
  54. #define ULONG unsigned long
  55. #endif
  56. #ifndef LONG
  57. #define LONG long
  58. #endif
  59. #endif
  60.  
  61. #ifndef FRACT
  62. #define FRACT double
  63. #endif
  64.  
  65. typedef struct { double x,y,z; } XYZ_st;    /* Used to be val[3] */
  66. typedef struct { UBYTE r,g,b;  } RGB_st;    /* Used to be val[3] */
  67. typedef struct { XYZ_st came, rota; double foca; } OBSV;
  68. typedef struct { double at, by; RGB_st to; } FADE;
  69. typedef struct { RGB_st hori, zeni; } SKYC;
  70. typedef char BRSH[81];
  71. typedef struct { XYZ_st tran, scal, rota1, rota2, rota3; } MTRX;
  72. typedef struct { XYZ_st xaxi, yaxi, zaxi; } AXIS;
  73. typedef struct { char path[19]; XYZ_st tran, rota, scal; UWORD info; } STRY;
  74. typedef struct {
  75.     MTRX mtrx;
  76.     char filename[81];
  77. } EXTR;
  78. typedef struct {
  79.     UBYTE type;
  80.     float indx;
  81. } MTTR;
  82. struct OBJECT {
  83.     EXTR *extr;    /* Either EXTR or DESC */
  84.     struct DESC *desc;
  85.     struct OBJECT *parent;    /* whose child this OBJECT is */
  86.     struct OBJECT *child;    /* children of this OBJECT - not for EXTR */
  87.     struct OBJECT *next;    /* At this level in the hierarchy */
  88.     void *user;        /* User-defined data for any purpose */
  89. };
  90. typedef struct OBJECT OBJECT;
  91. typedef struct {
  92.     UWORD num;
  93.     UBYTE *eflg;
  94. } EFLG;
  95. struct FGRP {
  96.     struct FGRP *next;    /* Linked list */
  97.     UWORD num;
  98.     char name[19];    /* 18 allowed in file */
  99.     UWORD *face;
  100. };
  101. typedef struct FGRP FGRP;
  102. typedef struct {
  103.     UWORD  Flags;
  104.     MTRX   TAxis;
  105.     double Params[16];
  106.     UBYTE  PFlags[16];
  107.     UBYTE  SubName[81];
  108.     UBYTE  Length;
  109.     UBYTE  Name[81];
  110. } TXT2;
  111. typedef struct DESC {
  112.     char name[19];
  113.     WORD *shap;
  114.     XYZ_st *posi;
  115.     AXIS *axis;
  116.     XYZ_st *size;
  117.     XYZ_st *pnts;
  118.     RGB_st *colr, *refl, *tran, *spc1;
  119.     UWORD *edge, *face, pcount, ecount, fcount; 
  120.     UBYTE *clst, *rlst, *tlst;
  121.     double *tpar;
  122.     UBYTE *surf;
  123.     MTTR  *mttr;
  124.     UBYTE *spec;
  125.     UBYTE *prp0, *prp1;
  126.     double *ints;
  127.     XYZ_st *int1;
  128.     STRY *stry;
  129.     FGRP *fgrp;
  130.     EFLG *eflg;
  131.     TXT2 *txt2[4];
  132. } DESC;
  133.  
  134. /* extern UBYTE defclst[3], defrlst[3], deftlst[3], defspc1[3]; */
  135.  
  136. /* Add staging file information for Imagine support */
  137. /* It appears that the staging files use 3 FRACT's to represent colors
  138.  * instead of 3 UBYTEs...  Hmmm...
  139.  */
  140.  
  141. struct SAXIS { struct SAXIS *next, *prev; UWORD flags, start, stop; };
  142. typedef struct SAXIS SAXIS;
  143.  
  144. struct GLB2 {
  145.     struct GLB2 *next, *prev;
  146.     UWORD flags, start, stop;
  147.     ULONG sky_blending;
  148.     double starfield;
  149.     ULONG transition;
  150.     /* The following are really colors */
  151.     XYZ_st ambient, horizon, zenith1, zenith2, fog_color;
  152.     double fog_bottom, fog_top, fog_length;
  153.     ULONG brush_seq, backdrop_seq;
  154.     char backdrop[256];            /* Fixed length */
  155.     char globalbrush[256];        /* Variable length */
  156. };
  157. typedef struct GLB2 GLB2;
  158.  
  159. struct LITE {
  160.     struct LITE *next, *prev;
  161.     UWORD flags, start, stop;
  162.     /* The following are really colors */
  163.     XYZ_st color;
  164.     ULONG transition;
  165. };
  166. typedef struct LITE LITE;
  167.  
  168. struct SFILE {
  169.     struct SFILE *next, *prev;
  170.     UWORD flags, start, stop;
  171.     double cycles_to_perform;
  172.     double initial_cycle_phase;
  173.     ULONG transition;
  174.     char object_description[256];    /* Variable length */
  175. };
  176. typedef struct SFILE SFILE;
  177.  
  178. struct OSIZ { struct OSIZ *next,*prev; UWORD flags, start, stop; XYZ_st size; };
  179. typedef struct OSIZ OSIZ;    /* Size */
  180.  
  181. struct POSN { struct POSN *next,*prev; UWORD flags, start, stop; XYZ_st posn; };
  182. typedef struct POSN POSN;    /* Position */
  183.  
  184. struct ALGN { struct ALGN *next,*prev; UWORD flags, start, stop; XYZ_st algn; };
  185. typedef struct ALGN ALGN;    /* Alignment */
  186.  
  187. struct PALN { struct PALN *next,*prev; UWORD flags, start, stop; };
  188. typedef struct PALN PALN;        /* Path Alignment */
  189.  
  190. struct PTH2 {
  191.     struct PTH2 *next, *prev;
  192.     UWORD flags, start, stop;
  193.     ULONG acceleration_frames;
  194.     double start_speed;
  195.     ULONG deacceleration_frames;
  196.     double end_speed;
  197.     char path[256];                /* Variable length */
  198. };
  199. typedef struct PTH2 PTH2;        /* Follow Path */
  200.  
  201. struct TALN {
  202.     struct TALN *next, *prev;
  203.     UWORD flags, start, stop;
  204.     double initial_y, final_y;
  205.     char trackobj[256];            /* Variable length */
  206. };
  207. typedef struct TALN TALN;    /* Track alignment */
  208.  
  209. struct SOBJ {
  210.     struct SOBJ *next, *prev;
  211.     /* Required subchunks in the SOBJ chunk... */
  212.     char name[18];    /* CHUNK: Name, fixed=18 */
  213.     UWORD stgf;        /* CHUNK: always zero? */
  214.     /* Possible subchunks in the SOBJ chunk... */
  215.     OSIZ *osiz;        /* Size */
  216.     POSN *posn;        /* Position */
  217.     ALGN *algn;        /* Alignment */
  218.     PALN *paln;        /* Path Alignment */
  219.     TALN *taln;        /* Track Alignment */
  220.     PTH2 *pth2;        /* Follow Path */
  221.     GLB2 *glb2;        /* Globals */
  222.     SAXIS *axis;    /* Stagefile AXIS */
  223.     LITE *lite;        /* Light */
  224.     SFILE *file;    /* Stage file */
  225. };
  226. typedef struct SOBJ SOBJ;
  227.  
  228. typedef struct {
  229.     UWORD maxf;
  230.     /* Just so we don't have to search through the doubly-linked list */
  231.     /* every time we wish to add to the tail, keep a pointer to head&tail */
  232.     SOBJ *head, *tail;
  233. } ISTG;
  234.  
  235. /* Back to old Turbo Silver stuff... */
  236.  
  237. #define STNC BRSH
  238. #define TXTR BRSH
  239. typedef struct {
  240.     BRSH brsh[8];
  241.     STNC stnc[8];
  242.     TXTR txtr[8];
  243.     OBSV *obsv;
  244.     BYTE otrk[19];
  245.     STRY *ostr;
  246.     FADE *fade;
  247.     SKYC *skyc;
  248.     RGB_st *ambi;
  249.     BYTE *glb0;
  250. } INFO;
  251.  
  252. typedef struct {
  253.     INFO *info;            /* The INFO description in the file */
  254.     ISTG *istg;            /* Imagine staging file */
  255.     OBJECT *object;        /* The first object in the world */
  256.     void *user;        /* User-defined data for any purpose */
  257.     /* Some private variables needed to parse input file - don't touch! */
  258.     int num_OBJ, num_DESC, num_TOBJ, cur_line;
  259.     FILE *inp;
  260.     OBJECT *curobj;
  261. } WORLD;
  262.  
  263. typedef struct {
  264.     double minx, maxx, miny, maxy, minz, maxz;
  265. } MBB;
  266.  
  267. #ifdef __STDC__
  268. #define P0()            void
  269. #define P1(a)            a
  270. #define P2(a,b)            a,b
  271. #define P3(a,b,c)        a,b,c
  272. #define P4(a,b,c,d)        a,b,c,d
  273. #define P5(a,b,c,d,e)    a,b,c,d,e
  274. #else
  275. #define P0()        
  276. #define P1(a)        
  277. #define P2(a,b)        
  278. #define P3(a,b,c)    
  279. #define P4(a,b,c,d)    
  280. #define P5(a,b,c,d,e)    
  281. #endif
  282.  
  283. WORLD *read_World(P1(FILE*));            /* world = read_World(FILE *); ..figures out format */
  284. WORLD *free_World(P1(WORLD*));            /* world = free_World(world *);   ...frees a WORLD* */
  285. void merge_World(P1(WORLD*));            /* merge_World(world *); ..optimizes points & edges */
  286. WORLD *read_TTDDD(P1(FILE*));            /* world = read_TTDDD(FILE *);      ...0 on failure */
  287. WORLD *read_TDDD(P1(FILE*));            /* world = read_TDDD(FILE *);       ...0 on failure */
  288. WORLD *read_LWOB(P1(FILE*));            /* world = read_LWOB(FILE *);       ...0 on failure */
  289. WORLD *read_ISTG(P1(FILE*));            /* world = read_ISTG(FILE *);       ...0 on failure */
  290. int write_TTDDD(P2(WORLD*,FILE*));        /* write_TTDDD(world *, FILE *);    ...0 on failure */
  291. int write_TDDD(P2(WORLD*,FILE*));        /* write_TDDD(world *, FILE *);     ...0 on failure */
  292. int write_Rayshade(P2(WORLD*,FILE*));    /* write_Rayshade(world *, FILE *); ...0 on failure */
  293. int write_PostScript(P3(WORLD*,FILE*,int));    /* write_PostScript(world *, FILE *, view); ..ditto */
  294. int write_MIF(P3(WORLD*,FILE*,int));    /* write_MIF(world *, FILE *, view); ..0 on failure */
  295. void calculate_MBB_world(P1(WORLD*));    /* calculate_MBB_world(WORLD *); */
  296. void calculate_MBB(P1(OBJECT*));        /* calculate_MBB(OBJECT *); */
  297. OBJECT *linear_morph(P3(OBJECT*,OBJECT*,double));    /* linear_morph(obj1, obj2, time); /* 0.0<=time<=1.0 */
  298. OBJECT *create_object(P0());            /* p = create_object(); */
  299. OBJECT *free_object(P1(OBJECT*));        /* from freeworld.c */
  300. int count_objects(P2(OBJECT*,OBJECT**));    /* Used by "morph()" */
  301. int morph(P5(WORLD*,WORLD*,int,char*,OBJECT*(*func)()));    /* morph(world1, world2, num, name, morph_function); */
  302. void free_desc(P1(DESC*));                /* free_desc(DESC *); */
  303. void match_points(P3(int,OBJECT*,OBJECT*));    /* match_points(numpoints, obj1, obj2); */
  304. void sort_points(P2(DESC*,int(*cmp)()));
  305. int cmpXYZ(P2(XYZ_st*,XYZ_st*));        /* comparison for sort_points */
  306. void move_extr(P2(OBJECT*,MTRX*));
  307. void OUT_MEM(P1(char*));
  308. void load_staging_frame_objects(P2(WORLD*,int));    /* (world, frame); load a frame's objects */
  309. int write_OFF(P4(WORLD*,char*,int,int));
  310. int write_NFF(P2(WORLD*,FILE*));
  311. int write_DXF(P2(WORLD*,FILE*));
  312. int write_POVRay(P2(WORLD*,FILE*));
  313. int write_Vort(P2(WORLD*,FILE*));
  314. int write_LWOB(P2(WORLD*,FILE*));
  315.  
  316. /* Some stuff for PostScript and MIF output */
  317. extern double XSIZE, YSIZE;    /* (in inches) Default: 8.5x11.0 */
  318.  
  319. #define VIEW_TOP    0    /* eye at (0,0,+inf) */
  320. #define VIEW_FRONT    1    /* eye at (0,-inf,0) */
  321. #define VIEW_ISO    2    /* eye at (+inf,-inf,+inf) */
  322. #define VIEW_RIGHT    3    /* eye at (+inf,0,0) */
  323. #define VIEW_ALL_FOUR 4    /* Place all on the same page */
  324.